package 单周赛.history;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 *
 */
public class 第283场单周赛 {

    public static void main(String[] args) {

        String s = "K1:L2";
        System.out.println(cellsInRange(s));

        int[] nums = {53, 41, 90, 33, 84, 26, 50, 32, 63, 47, 66, 43, 29, 88, 71, 28, 83};
        System.out.println(minimalKSum(nums, 76));

    }

    /**
     * 6016. Excel 表中某个范围内的单元格 显示英文描述
     * 通过的用户数5863
     * 尝试过的用户数5950
     * 用户总通过次数5922
     * 用户总提交次数6920
     * 题目难度Easy
     * Excel 表中的一个单元格 (r, c) 会以字符串 "<col><row>" 的形式进行表示，其中：
     *
     * <col> 即单元格的列号 c 。用英文字母表中的 字母 标识。
     * 例如，第 1 列用 'A' 表示，第 2 列用 'B' 表示，第 3 列用 'C' 表示，以此类推。
     * <row> 即单元格的行号 r 。第 r 行就用 整数 r 标识。
     * 给你一个格式为 "<col1><row1>:<col2><row2>" 的字符串 s ，其中 <col1> 表示 c1 列，<row1> 表示 r1 行，<col2> 表示 c2 列，<row2> 表示 r2 行，并满足 r1 <= r2 且 c1 <= c2 。
     * <p>
     * 找出所有满足 r1 <= x <= r2 且 c1 <= y <= c2 的单元格，并以列表形式返回。单元格应该按前面描述的格式用 字符串 表示，并以 非递减 顺序排列（先按列排，再按行排）。
     * <p>
     * 思路：模拟
     *
     * @param s
     * @return
     */
    public static List<String> cellsInRange(String s) {
        List<String> list = new ArrayList<>();
        int beginRow = s.charAt(1) - '0';
        int endRow = s.charAt(4) - '0';
        int beginCol = s.charAt(0) - 'A';
        int endCol = s.charAt(3) - 'A';

        for (int column = beginCol; column <= endCol; column++) {
            for (int row = beginRow; row <= endRow; row++) {
                char col = (char) (column + 'A');
                list.add("" + col + row);
            }
        }
        return list;
    }

    /**
     * 6017. 向数组中追加 K 个整数 显示英文描述
     * 通过的用户数3048
     * 尝试过的用户数5821
     * 用户总通过次数3137
     * 用户总提交次数22903
     * 题目难度Medium
     * 给你一个整数数组 nums 和一个整数 k 。请你向 nums 中追加 k 个 未 出现在 nums 中的、互不相同 的 正 整数，并使结果数组的元素和 最小 。
     * <p>
     * 返回追加到 nums 中的 k 个整数之和。
     * 思路：等差数列求和
     *
     * @param nums
     * @param k
     * @return
     */
    public static long minimalKSum(int[] nums, int k) {
        long ans = 0;
        Arrays.sort(nums);
        int curK = 0;
        if (nums[0] > 1) {
            for (int i = 1; i < nums[0]; i++) {
                ans += i;
                curK++;
                if (curK == k) {
                    return ans;
                }
            }
        }
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = nums[i] + 1; j < nums[i + 1]; j++) {
                ans += j;
                curK++;
                if (curK == k) {
                    return ans;
                }

            }
        }
        long Sn = (long) (k - curK) * (nums[nums.length - 1] + 1) +
                (long) (k - curK) * (k - curK - 1) / 2;
        ans += Sn;
        return ans;
    }


}
